#ifndef GALAXY_HH_
# define GALAXY_HH_
# include "World.hh"
# include "Star.hh"
# include "Fleet.hh"
# include <boost/noncopyable.hpp>
# include <QtCore>

/**
 * \brief Galaxis osztály.
 *
 * A galaxisokban egymástól teljesen független játékok játszódnak. Egy játékban
 * egy felhasználó csak egyszer vehet részt.
 */
class World::Galaxy: private boost::noncopyable {
    public: typedef QMap< QString, spGalaxy > GalaxyMap;
    public: typedef QMap< pUser, spPlayer > PlayerMap;
    public: typedef QMap< u8, spStar > StarMap;
    public: typedef QMap< u8, spFleet > FleetMap;

    protected: static QMutex staticLock;
    protected: static GalaxyMap galaxies;

    public: static spGalaxy construct(
      QString const& name, spUser user, spPlayer& player,
      u2 minPlayers = 2, u2 maxPlayers = UNLIMITED
    );
    public: static void destruct(QString const& name);
    public: static spGalaxy select(QString const& name);
    public: static GalaxyMap get_galaxies();

    /// \brief A példány zárolására szolgáló mutex.
    protected: mutable QMutex lock;

    /// \brief A galaxis neve, globálisan egyedi azonosító.
    public: QString const name;

    /// \brief Elkezdődött-e a játék a galaxisban.
    protected: bool started;

    /// \brief A játékosok minimális száma, amellyel a játék már elkezdhető.
    public: u2 const minPlayers;

    /// \brief A játékosok maximális száma, ahányan beléphetnek.
    public: u2 const maxPlayers;

    /// \brief A játékosok közül hányan fejezték be a körüket.
    protected: u2 nextTurnCtr;

    /// \brief A játékosok.
    protected: PlayerMap players;

    /// \brief A csillagok.
    protected: StarMap stars;

    protected: Galaxy(QString const& name, u2 minPlayers, u2 maxPlayers);

    public: void destruct();
    public: bool join(spUser user, spPlayer& player, PlayerMapByUser& others);
    protected: void next_turn();
    public:    bool inc_next_turn_ctr();
    public: spPlayer        get_player(PlayerMapByUser::key_type id) const;
    public: PlayerMapByUser get_players()    const;
    public: spFleet         get_fleet(u8 id) const;
    public: FleetMap        get_fleets()     const;
    public: spStar          get_star(u8 id)  const;
    public: StarMap         get_stars()      const;
};

#endif // ndef GALAXY_HH_
